1 module examples.HelloWorld;
2 import phidget21;
3 import std.stdio : writeln, writefln, readln;
4 import std.string : toStringz, fromStringz;
5 
6 extern(C)
7 int AttachHandler(CPhidgetHandle device, void* userPtr) {
8 	int serialNumber;
9 	const char* name;
10 
11 	LocalErrorCatcher(CPhidget_getDeviceName(device, &name));
12 	LocalErrorCatcher(CPhidget_getSerialNumber(device, &serialNumber));
13 
14 	writefln("Hello Device %s, Serial Number: %d", name.fromStringz, serialNumber);
15 
16 	return 0;
17 }
18 
19 extern(C)
20 int DetachHandler(CPhidgetHandle device, void* userPtr) {
21 	int serialNumber;
22 	const char* name;
23 
24 	LocalErrorCatcher(CPhidget_getDeviceName(device, &name));
25 	LocalErrorCatcher(CPhidget_getSerialNumber(device, &serialNumber));
26 
27 	writefln("Goodbye Device %s, Serial Number: %d", name.fromStringz, serialNumber);
28 	return 0;
29 }
30 
31 // When using an error handler with the manager, it takes a
32 // CPhidgetManagerHandle, when using an individual object, the
33 // object serves as its own handle.
34 extern(C)
35 int LibraryErrorHandler(CPhidgetManagerHandle device, void* userPtr, int errorCode, const char* errorDescription) {
36 	writeln("Error Event: %d - %s", errorCode, errorDescription);
37 	return 0;
38 }
39 
40 // This error handler can handle any CPhidget function that returns an int
41 extern(C)
42 int LocalErrorCatcher(int errorCode) {
43 	const char* errorDescription;
44 
45 	// If the error code is 0, everything is okay
46 	if (errorCode != 0) {
47 		// Otherwise, you can print specific messages or perform actions by error value.
48 
49 		switch(errorCode) {
50 			default:
51 				writefln("Error: An error occurred with code %d.", errorCode);
52 				LocalErrorCatcher(CPhidget_getErrorDescription(errorCode, &errorDescription));
53 				writefln("The description for this error is %s", errorDescription.fromStringz);
54 				break;
55 		}
56 	}
57 
58 	return 0;
59 }
60 
61 void main() {
62 	Phidget.load();
63 
64 	int result;
65 	const char* err;
66 
67 	CPhidgetManagerHandle device;
68 	LocalErrorCatcher(CPhidgetManager_create(&device));
69 
70 	LocalErrorCatcher(CPhidgetManager_set_OnAttach_Handler(device, &AttachHandler, null));
71 	LocalErrorCatcher(CPhidgetManager_set_OnDetach_Handler(device, &DetachHandler, null));
72 	LocalErrorCatcher(CPhidgetManager_set_OnError_Handler(device, &LibraryErrorHandler, null));
73 
74 	writeln("Opening...");
75 	// Most opening and closing would be via a cast to
76 	// (CPhidgetHandle), however, this manager has its
77 	// own handle struct to cast to.
78 	LocalErrorCatcher(CPhidgetManager_open(device));
79 
80 	writeln("Phidget Simple Playground (plug and unplug devices)");
81 	writeln("Press Enter to end anytime...");
82 	readln();
83 
84 	writeln("Closing...");
85 	LocalErrorCatcher(CPhidgetManager_close(device));
86 	LocalErrorCatcher(CPhidgetManager_delete(device));
87 }